package com.mjkj.demo;

import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.github.davidfantasy.mybatisplus.generatorui.GeneratorConfig;
import com.github.davidfantasy.mybatisplus.generatorui.MybatisPlusToolsApplication;
import com.github.davidfantasy.mybatisplus.generatorui.mbp.NameConverter;
import com.github.davidfantasy.mybatisplus.generatorui.mbp.TemplateVaribleInjecter;

import java.util.HashMap;
import java.util.Map;

/**
 *
 * mybatis-plus-generator-ui
 *
 * 提供交互式的Web UI
 * 用于生成兼容mybatis-plus框架的相关功能代码，包括Entity,Mapper,Mapper.xml,Service,Controller等 ，
 * 可以自定义模板以及各类输出参数，也可通过SQL查询语句直接生成代码。
 *
 *
 * @author cwh
 * @date 2023/06/20
 **/

public class GeneratorUIServer {

    private static final int DELTA = 'a' - 'A';


    public static void main(String[] args) {


        //数据库连接
        GeneratorConfig config = GeneratorConfig.builder()
                .templateVaribleInjecter(new TemplateVaribleInjecter(){
            @Override
            public Map<String, Object> getCustomTemplateVaribles(TableInfo tableInfo){
                Map<String, Object> params=new HashMap<>();
                params.put("springdoc",true);
                return params;
            }
        })
                .jdbcUrl("jdbc:mysql://47.102.203.113:3306/starfish_YJia")
                .userName("root")
                .password("MJKJ426")
                .driverClassName("com.mysql.cj.jdbc.Driver")
                //数据库schema，MSSQL,PGSQL,ORACLE,DB2类型的数据库需要指定
                .schemaName("starfish_YJia")
                //如果需要修改entity及其属性的命名规则，以及自定义各类生成文件的命名规则，可自定义一个NameConverter实例，覆盖相应的名称转换方法，详细可查看该接口的说明：
                .nameConverter(new NameConverter() {
                    /**
                     * 自定义Service类文件的名称规则
                     */
                    @Override
                    public String serviceNameConvert(String tableName) {
                        return this.entityNameConvert(tableName) + "Service";
                    }

                    /**
                     * 自定义Controller类文件的名称规则
                     */
                    @Override
                    public String controllerNameConvert(String tableName) {
                        return this.entityNameConvert(tableName) + "Controller";
                    }

                    @Override
                    public String mapperNameConvert(String tableName) {
                        return this.entityNameConvert(tableName) + "Mapper";
                    }

                    @Override
                    public String mapperXmlNameConvert(String tableName) {
                        return this.entityNameConvert(tableName) + "Mapper";
                    }

                    @Override
                    public String serviceImplNameConvert(String tableName) {
                        return this.entityNameConvert(tableName) + "ServiceImpl";
                    }

                    public String entityNameConvert(String tableName) {
                        return toCamelCase(tableName);
                    }
                })
                //所有生成的java文件的父包名，后续也可单独在界面上设置
                .basePackage("com.mjkj.demo")
                .port(8068)
                .build();
        MybatisPlusToolsApplication.run(config);
    }

    public static String toCamelCase(String source) {
        boolean big = true;
        if (source.isEmpty()) {return source;}
        StringBuilder res = new StringBuilder();
        // 其他字符
        int len = source.length();
        // 上一个字符是下划线
        boolean prevUnderline = false;
        for (int i = 0; i < len; i++) {
            char c = source.charAt(i);
            if (c == '_') {
                prevUnderline = true;
                continue;
            }
            if (res.length() == 0) { // 首字符
                if (big && isSmallLetter(c)) { // 大驼峰
                    res.append((char) (c - DELTA));
                } else if (!big && isBigLetter(c)) { // 小驼峰
                    res.append((char) (c + DELTA));
                } else {
                    res.append(c);
                }
            } else if (prevUnderline && isSmallLetter(c)) {
                res.append((char) (c - DELTA));
            } else {
                res.append(c);
            }
            prevUnderline = false;
        }
        return res.toString();
    }

    public static boolean isBigLetter(char source) {
        return source >= 'A' && source <= 'Z';
    }

    public static boolean isSmallLetter(char source) {
        return source >= 'a' && source <= 'z';
    }



}
